Một số trick nhỏ để làm gọn lua script 4.x

🍀 Hội quán võ lâm, 24/9/2023

💡 Tác giả: Julian Vương

✍️ Soạn giả: Huy Nguyễn

🏠 > Tàng thư bảo điển

Khái niệm clean code, không nhớ đã đọc ở đâu rồi. Biết thì đơn giản, nhưng thực hành thì khá phức tạp. Dưới đây là một số trick mình tổng hợp theo kinh nghiệm cá nhân

1. Tận dụng vòng lặp

Thay vì tạo ra những câu lệnh trùng lặp thì gói nó vào 1 vòng lặp. Nếu nắm bắt tốt quy luật thì việc dùng vòng lặp cũng không phức tạp lắm.

Hình 1

2. Sử dụng shorten if-else statement nếu có thể

Thay vì dùng:

if <điều kiện> then <do somethine> else <do else-thing> end

thì dùng shorten if-else:

<điều kiên> and <if true> or <if false>

Ví dụ: muốn kiểm tra nếu là dòng chẵn thì cho màu violet còn dòng lẻ thì cho màu pink, thay vì ta dùng

local szColor
if mod(nLine,2) == 0 then szColor = "violet" else szColor = "pink" end

thì dùng thẳng như sau:

local szColor = mod(nLine, 2) == 0 and "violet" or "pink"

3. Khai báo biến như 1 function để trả về kết quả (Hình 2)

Ví dụ:

local szSeries = function(num)
return format("<color=%s>%s<color>", tbSeries[num][2], tbSeries[num][1])
end

dòng code trên sẽ trả về 1 string có dạng &lt;color=(màu theo ngũ hành)&gt;(tên ngũ hành)&gt;

Hình 2

4. Khai báo Prop trong bảng như 1 function nếu cần thiết (hình 3+4)

Hình 3

Thay vì gọi cùng 1 hàm giống nhau để làm các công việc khác nhau, thì tập trung chúng lại 1 table. Sự khác biệt duy nhất của chúng là các Hàm sẽ được gọi nếu chọn.

Hình 4

Ví du: Add điểm kinh nghiệm thì dùng hàm AddOwnExp, add tiềm năng thì dùng AddProp,… Tất cả các điểm điều có các thuộc tính gần giống nhau, chỉ khác ở con số nhập vào tối đa (nLimit), đơn vị tính (szUnit) và hàm sẽ sử dụng (pFun).

Vì vậy ta có thể tập trung chúng lại vào 1 table và sử dụng 1 -> 2 function duy nhất để áp dụng khi người chơi lựa chọn

5. Rút gọn hàm CreateNewSayEx

Mỗi khi sử dụng CreateNewSayEx, Say, CreateTaskSay để hiện bảng dialog cho người chơi lựa chọn. Thì hầu như đều phải thêm 2 lựa chọn là Trở lạiKết thúc đối thoại.

Nếu có thể rút ngắn được 2 dòng này, thì mỗi dialog rút ngắn được 2 dòng, và toàn bộ code sẽ rút ngắn được khá nhiều dòng. Hơn thế nữa code trông có vẻ sạch hơn 🤣

Hình 5 chỉ là ví dụ tôi tự viết 1 function để làm việc này. Mới chia sẻ lần đầu còn thiếu nhiều kinh nghiệm, mong ae bỏ quá cho

Hình 5

💬 Thảo luận

Tham gia trao đổi thêm tại bài viết gốc https://fb.com/groups/volamquan/posts/1248330749209448/

❓Hỏi đáp trích ngang

Câu hỏi 1: Kinh nghiệm số 2 có cần thiết?

Ly Mai: cái số 2 shorthand if else kia đọc code đau não quá bạn ạ. Không nên viết tát kiểu ấy. Viết tường mình ra cho dễ hiểu, dễ debug. C chạy nhanh mà sao phải ‘khổ d*m’ thế?.

Huy Nguyen: Theo mình nếu mệnh đề else chỉ có duy nhất một lô gích thì có thể xài toán tử 3 ngôi như cách được trình bày trong kinh nghiệm số 2 ở trên. Nhiều hơn 2 mệnh đề else nên viết tường minh rõ ràng ra.

local szColor = mod(nLine, 2) == 0 and "violet" or "pink"

cũng tương đương với code C++

string szColor = nLine % 2 == 0 ? "violet" : "pink";

Nếu b viết đủ nhiều, khi quen mắt thì đọc cũng không khó hiểu mấy. Tuy nhiên, nếu bạn vẫn thấy rối, có một cách khác là viết hàm hỗ trợ cho cấu trúc trên như sau: ```lua function iff(logic, true_value, false_value) return logic and true_value or false_value; end

local szColor = iff(nLine % 2 == 0, “violet”, “pink”). ````


© Hội quán võ lâm, 2021-2024

Bản quyền phân phối nội dung thuộc về Hội quán võ lâm. Quyền tác giả thuộc về người đã sáng tạo nội dung được thể hiện rõ trong bài viết.

Mọi hình thức sao chép phân phối lại yêu cầu giữ nguyên toàn bộ bài viết bao gồm cả tiêu đề, nội dung và hình thức. Không được phép chỉnh sửa, thay đổi các liên kết dẫn về Hội quán võ lâm, cũng như thông tin về tác giả.

Các vấn đề tác quyền liên hệ: jx1offline@gmail.com